package com.mrt.chatgpt.data.types.sdk.weixin;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Author 86135
 * @Date 2024/3/15 18:49
 * @Description
 * @Version 1.0
 * @快捷键 getterANDsetter ALT+Insert
 * @快捷键 Ctrl+/或者Ctrl+Shift+/都可以快速注释
 * @快捷键 Ctrl+D 快速复制代码
 * @“ctrl+r”快捷键,用于当前文件内容替换,指的是在当前打开的文件中替换匹配的字符,只操作一个文件;
 * @ALT+鼠标左键 整列编辑
 * @快捷键提示 ALT+Enter
 * @快捷键 快速写注释：在方法函数上方输入/** 然后回车
 * @快捷键 Ctrl+O，选择重写的方法
 * @快捷键 ALT+INSERT
 */
public class SignatureUtil {
    /**
     * 验证签名
     */
    public static boolean check(String token, String signature, String timestamp, String nonce){
        String[] arr = new String[]{token, timestamp, nonce};
        //将token，timestamp，nonce三个参数进行字典序排序
        sort(arr);
        //将排好序的这些字符串依次连接起来
        StringBuilder content = new StringBuilder();
        for(String s : arr){
            content.append(s);
        }
        MessageDigest md;
        String tmpStr = null;
        try{
            md = MessageDigest.getInstance("SHA-1");
            //将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        }
        // 将sha1加密后的字符串可与signature对比，标识该请求来源于微信
        return tmpStr != null && tmpStr.equals(signature.toUpperCase());
    }

    private static String byteToStr(byte[] byteArray) {
        StringBuilder strDigest = new StringBuilder();
        for(byte b : byteArray){
            strDigest.append(byteToHexStr(b));
        }
        return strDigest.toString();
    }

    private static String byteToHexStr(byte mByte) {
        char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        return new String(tempArr);
    }

    private static void sort(String[] str){
        for(int i = 0; i < str.length - 1; i++){
            for(int j = i + 1; j <str.length; j++){
                if(str[j].compareTo(str[i]) < 0){
                    String temp = str[i];
                    str[i] = str[j];
                    str[j] = temp;
                }
            }
        }
    }

}
